package com.secxiot.provider.user.dao;

import com.secxiot.provider.user.entity.*;
import com.secxiot.provider.user.vo.PatientVo;
import com.secxiot.provider.user.vo.UserSimpleVo;
import com.secxiot.provider.user.vo.UserVo;
import org.apache.ibatis.annotations.Param;
import org.springframework.stereotype.Repository;

import java.util.List;
import java.util.Map;

@Repository
public interface UserMapper {
    long countByExample(UserExample example);

    int deleteByExample(UserExample example);

    int deleteByPrimaryKey(Long userId);

    int insert(UserDo record);

    int insertSelective(UserDo record);

    List<UserDo> selectByExample(UserExample example);

    UserDo selectByPrimaryKey(Long userId);

    int updateByExampleSelective(@Param("record") UserDo record, @Param("example") UserExample example);

    int updateByExample(@Param("record") UserDo record, @Param("example") UserExample example);

    int updateByPrimaryKeySelective(UserDo record);

    int updateByPrimaryKey(UserDo record);


    List<UserDo> selectUserAll(Map<String, Object> map);

    UserDo getById(Long userId);

    UserDo getByPhone(@Param("mobile") String mobile, @Param("clientType") String clientType, @Param("openId") String openId);

    int update(UserDo userDao);

    int save(UserDo userDao);

    int registry(UserDo userDo);

    UserDo getByUsername(@Param("username") String username, @Param("clientType") String clientType);

    UserDo getByWxOpenid(String wxOpenid);

    UserDo getByName(String name);

    //查询部门医护列表
    List<UserSimpleVo> selectDoctorsByDeptIdAndTypes(@Param("types") List<String> types,
                                                     @Param("deptId") Long deptId,
                                                     @Param("directFlag") Integer directFlag,
                                                     @Param("taskType") String taskType);

    //查询部门患者列表
    List<UserSimpleVo> selectPatientsByDeptId(@Param("deptId") Long deptId,
                                              @Param("directFlag") Integer directFlag);

    //查询患者用户信息
    List<PatientVo> selectUserDepts(@Param("userId") Long userId,
                                    @Param("type") String type,
                                    @Param("deptId") Long deptId);

    //添加紧急联系人
    int addUserEmergencyContact(UserEmergencyContact userEmergencyContact);

    //查看紧急联系人
    UserEmergencyContact selectUserEmergencyContact(Long userId);

    //删除紧急联系人
    Long deleteUserEmergencyContact(Long userId);

    //医护的直属信息查询
    UserDeptDict selectUserDeptById(@Param("userId") Long userId,
                                    @Param("type") String type);

    //判断邀请码重复
    UserDo getPromoteCode(@Param("promoteCode") String promoteCode);

    /**
     * 获取分享用户列表
     *
     * @param userId 用户ID
     * @return
     */
    List<UserVo> getPromoteUserList(Long userId, Long pageNo, Long pageSize);

    /**
     * 保存推广关系
     * @param userPromote 推广关系对象
     * @return
     */
    int saveUserPromote(UserPromote userPromote);

    /**
     * 保存用户提现账号
     * @param userAccount 用户账户对象
     * @return
     */
    int saveUserAccount(UserAccount userAccount);

    /**
     * 编辑用户提现账号
     * @param userAccount 用户账户对象
     * @return
     */
    int updateUserAccount(UserAccount userAccount);

    UserAccount getUserAccount(Long userId);

    /**
     * 校验用户是否帮绑定
     * @param userId 推广关系对象
     * @return
     */
    UserPromote getUserPromote(Long userId);

}